//
//  ViewController.m
//  UIHomeWork25_GCD调研
//
//  Created by Gollum on 16/8/17.
//  Copyright © 2016年 Gollum. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //1.GCD:全程是Grand center Dispatch 牛逼的中枢调度器
    //纯C语言,提供了非常多强大的函数
    
    //2.GCD是苹果公司多核的并行运算的解决方案
    //GCD会自动利用更多的CPU内核(比如 双核`四核)
    //GCD会自动管理线程的生命周期(创建线程,调度任务,销毁线程)
    //程序员只要高数gcd想要执行什么,不需要编写任何线程管理代码
    
    //3.(1)GCD存在于libdispatch.dylib这个库中,这个库包含了GCD所有的东西,但任何iOS程序运行的过程中会动态加载这个库,不需要手动导入
    //(2)GCD是纯C语言,因此我们编写GCD相关的代码时,面对函数而不是方法.
    //(3)GCD中的函数大多数都已dispatch开头
    
    
    //二任务与队列
    //(1)任务:执行什么操作
    //(2)队列:用来存放任务
    
    //GCD 的使用两个步骤
    //(1)定制任务
    //(2)确定想做的事情
    
    //注:将任务添加到队列中,GCD会自动将队列中的任务取出,放入对应的线程中执行,任务取出遵循:先进先出,后进后出准则
    
    
    //三,执行任务
    //1.GCD中有2个用来执行任务的函数
    //1.同步执行任务:在当前线程中执行dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
    

    //2.异步执行任务:在另一条线程中执行 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
    
    
    //四,队列
    //1.队列的类型
    //(1)并发队列(Concurrent Dispatch queue)可以让多个任务并发执行 (自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效
    
    //(2).串行队列(Serial Dispatch Queue)让任务一个接一个的执行(一个任务执行完后在执行下一个任务)
    //补充:两个参数
    //同步:当前线程中执行任务,不具备开启新线程的能力
    //异步:在新的线程中执行任务,具备开启新线程的能力
    
    //并发和串行决定了任务的执行方式
    //并发:多个任务并发(同时)执行
    //串行:一个任务执行完毕后,在执行下一个任务
    
    //(3)GCD中获取串行有2种途径
    //使用dispatch_queue_create函数创建串行队列
    //使用dispatch_get_main_queue()获得主队列,主队列是GCD中自带的一种特殊的串行队列,放在队列中的任务,都会在主队列中执行
    
    //(4)并发队列
    //GCD默认已经提供了全局并发队列,不需要手动创建
    //使用dispatch_get_global_queue函数获得全局的并发队列
    //dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列
//#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
//#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认（中）
//#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
//#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
    

    //[self demo1];
    [self demo2];
    //[self demo3];
    //[self demo4];
    
}

- (void)demo1{

    //获取全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //添加任务队列中
    //异步执行任务
    dispatch_async(queue, ^{
        NSLog(@"下载图片--------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"下载图片2-------%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"下载图片3--------%@",[NSThread currentThread]);
    });
   
    NSLog(@"主线程--------%@",[NSThread mainThread]);


}

- (void)demo2{
    //打印主线程
    NSLog(@"主线程--------%@",[NSThread mainThread]);
    //创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("wendingding", NULL);
    //第一个参数为串行队列的名称,是C语言的字符串
    //第二个参数为队列的属性,一般来说串行队列不需要赋值任何属性,所以通常传空值
    
    //2.添加任务到队列中执行
    dispatch_async(queue, ^{
        NSLog(@"下载图片1---------%@",[NSThread mainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"下载图片2---------%@",[NSThread mainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"下载图片3---------%@",[NSThread mainThread]);
    });
    //mrc下手动释放队列
   // dispatch_release(queue);

}

- (void)demo3{

//用同步函数往并发队列中添加任务
    //打印主线程
    NSLog(@"主线程------------%@",[NSThread mainThread]);

    //创建并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_sync(queue, ^{
        NSLog(@"下载图片1---------%@",[NSThread mainThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"下载图片2---------%@",[NSThread mainThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"下载图片3---------%@",[NSThread mainThread]);
    });

}

- (void)demo4{

    NSLog(@"用同步函数往串行队列中添加任务");
        //打印主线程
        NSLog(@"主线程----%@",[NSThread mainThread]);
    
    //创建串行队列
         dispatch_queue_t  queue= dispatch_queue_create("wendingding", NULL);
    
       //2.添加任务到队列中执行
         dispatch_sync(queue, ^{
            NSLog(@"下载图片1----%@",[NSThread currentThread]);
            });
         dispatch_sync(queue, ^{
            NSLog(@"下载图片2----%@",[NSThread currentThread]);
        });
         dispatch_sync(queue, ^{
            NSLog(@"下载图片3----%@",[NSThread currentThread]);
             });

}


//同步函数（1）并发队列：不会开线程（2）串行队列：不会开线程

//异步函数（1）并发队列：能开启N条线程（2）串行队列：开启1条线程























































- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
